/**
在08_TS中，鸭子类型（Duck Typing）是一种动态类型检测的概念，它强调对象的行为和特征，而不是对象的具体类型。
  1. 鸭子类型的定义
  - 鸭子类型的核心思想是“如果它像鸭子、叫声像鸭子，那么它就是鸭子”。在编程中，这意味着只要一个对象实现了特定的方法或属性，就可以将其视为某种类型，而不必关心它的具体类型。

  2. 特点
  - 灵活性：鸭子类型允许更灵活的代码设计，可以在运行时根据对象的行为来决定如何处理它，而不需要严格的类型检查。
  - 简化代码：使用鸭子类型可以减少代码中的类型检查，使代码更加简洁和易于维护。

  3. 使用场景
  - 鸭子类型在动态类型语言（如Python、JavaScript等）中尤为常见，但在TypeScript等静态类型语言中也可以应用。
  - 在需要处理多种类型的对象时，鸭子类型提供了一种简便的方法。例如，函数可以接受任何实现了特定方法的对象。

  4. 示例代码
  // 定义一个接口
  interface Quackable {
      quack(): void;
  }

  // 实现鸭子类型的类
  class Duck implements Quackable {
      quack() {
          console.log("鸭子叫：嘎嘎");
      }
  }

  class Person {
      quack() {
          console.log("人模仿鸭子叫：嘎嘎");
      }
  }

  // 函数接受任何实现了quack方法的对象
  function makeItQuack(thing: Quackable) {
      thing.quack();
  }

  // 使用鸭子类型
  const duck = new Duck();
  const person = new Person();

  makeItQuack(duck);   // 输出：鸭子叫：嘎嘎
  makeItQuack(person); // 输出：人模仿鸭子叫：嘎嘎
  5. 注意事项
  - 虽然鸭子类型提供了灵活性，但也可能导致运行时错误，因为在编译时无法检查对象是否确实实现了所需的方法或属性。
  - 使用鸭子类型时，开发者需要确保对象的行为符合预期，以避免潜在的错误。

  6. 总结
  鸭子类型是一种强调对象行为而非具体类型的编程概念，能够提高代码的灵活性和可重用性。在TypeScript等语言中，合理使用鸭子类型可以使代码更加简洁，但也需要注意可能带来的运行时错误。
 */
// TypeScript对于类型检测的时候使用的鸭子类型
// 鸭子类型: 如果一只鸟, 走起来像鸭子, 游起来像鸭子, 看起来像鸭子, 那么你可以认为它就是一只鸭子
// 鸭子类型, 只关心属性和行为, 不关心你具体是不是对应的类型
class Person {
  constructor(public name: string, public age: number) {}

  running() {}
}

class Dog {
  constructor(public name: string, public age: number) {}

  running() {}
}

function printPerson(p: Person) {
  console.log(p.name, p.age)
}

printPerson(new Person('tom', 18))
printPerson({name: "kobe", age: 30, running: function() {}})
printPerson(new Dog("旺财", 3))
const person: Person = new Dog("果汁", 5)

export {}
